package cn.iocoder.yudao.module.system.dal.mysql.gugu;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.gugu.vo.QsRankingPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.gugu.QsRankingDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 全球QS世界大学排名数据 Mapper
 */
@Mapper
public interface QsRankingMapper extends BaseMapperX<QsRankingDO> {

    /**
     * 根据大学名称查询QS排名数据
     *
     * @param universityName 大学名称
     * @return QS排名数据列表
     */
    default List<QsRankingDO> selectByUniversityName(String universityName) {
        return selectList(new LambdaQueryWrapperX<QsRankingDO>()
                .like(QsRankingDO::getUniversityName, universityName)
                .orderByAsc(QsRankingDO::getRank));
    }

    /**
     * 根据国家查询QS排名数据
     *
     * @param country 国家
     * @return QS排名数据列表
     */
    default List<QsRankingDO> selectByCountry(String country) {
        return selectList(new LambdaQueryWrapperX<QsRankingDO>()
                .eq(QsRankingDO::getCountry, country)
                .orderByAsc(QsRankingDO::getRank));
    }

    /**
     * 根据地区查询QS排名数据
     *
     * @param region 地区
     * @return QS排名数据列表
     */
    default List<QsRankingDO> selectByRegion(String region) {
        return selectList(new LambdaQueryWrapperX<QsRankingDO>()
                .eq(QsRankingDO::getRegion, region)
                .orderByAsc(QsRankingDO::getRank));
    }

    /**
     * 根据排名范围查询QS排名数据
     *
     * @param minRank 最小排名
     * @param maxRank 最大排名
     * @return QS排名数据列表
     */
    default List<QsRankingDO> selectByRankRange(Integer minRank, Integer maxRank) {
        return selectList(new LambdaQueryWrapperX<QsRankingDO>()
                .ge(minRank != null, QsRankingDO::getRank, minRank)
                .le(maxRank != null, QsRankingDO::getRank, maxRank)
                .orderByAsc(QsRankingDO::getRank));
    }

    /**
     * 根据大学唯一标识查询QS排名数据
     *
     * @param universityId 大学唯一标识
     * @return QS排名数据
     */
    default QsRankingDO selectByUniversityId(String universityId) {
        return selectOne(new LambdaQueryWrapperX<QsRankingDO>()
                .eq(QsRankingDO::getUniversityId, universityId));
    }

    /**
     * 分页查询QS排名数据
     *
     * @param reqVO 查询条件
     * @return 分页结果
     */
    default PageResult<QsRankingDO> selectPage(QsRankingPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<QsRankingDO>()
                .likeIfPresent(QsRankingDO::getUniversityName, reqVO.getUniversityName())
                .eqIfPresent(QsRankingDO::getCountry, reqVO.getCountry())
                .eqIfPresent(QsRankingDO::getRegion, reqVO.getRegion())
                .eqIfPresent(QsRankingDO::getCity, reqVO.getCity())
                .geIfPresent(QsRankingDO::getRank, reqVO.getMinRank())
                .leIfPresent(QsRankingDO::getRank, reqVO.getMaxRank())
                .orderByAsc(QsRankingDO::getRank));
    }

    /**
     * 检查指定大学唯一标识的数据是否已存在
     *
     * @param universityId 大学唯一标识
     * @return 是否存在
     */
    default boolean existsByUniversityId(String universityId) {
        return selectCount(new LambdaQueryWrapperX<QsRankingDO>()
                .eq(QsRankingDO::getUniversityId, universityId)) > 0;
    }

    /**
     * 根据大学唯一标识删除数据
     *
     * @param universityId 大学唯一标识
     * @return 删除的记录数
     */
    default int deleteByUniversityId(String universityId) {
        return delete(new LambdaQueryWrapperX<QsRankingDO>()
                .eq(QsRankingDO::getUniversityId, universityId));
    }

    /**
     * 获取排名前N的大学
     *
     * @param topN 前N名
     * @return QS排名数据列表
     */
    default List<QsRankingDO> selectTopN(Integer topN) {
        return selectList(new LambdaQueryWrapperX<QsRankingDO>()
                .orderByAsc(QsRankingDO::getRank)
                .last("LIMIT " + topN));
    }

    /**
     * 获取中国大学的QS排名数据
     *
     * @return QS排名数据列表
     */
    default List<QsRankingDO> selectChineseUniversities() {
        return selectList(new LambdaQueryWrapperX<QsRankingDO>()
                .eq(QsRankingDO::getCountry, "China")
                .orderByAsc(QsRankingDO::getRank));
    }
}
